home *** CD-ROM | disk | FTP | other *** search
/ Developer CD Series 2000 August: Tool Chest / Dev.CD Aug 00 TC Disk 2.toast / pc / sample code / interapplication comm / 7edit / source / svaegetdata.c < prev    next >
Encoding:
C/C++ Source or Header  |  2000-06-23  |  14.2 KB  |  499 lines

  1. /*
  2.     File:        SVAEGetData.c
  3.  
  4.     Contains:    
  5.  
  6.     Written by: Original version by Jon Lansdell and Nigel Humphreys.
  7.                 3.1 updates by Greg Sutton.
  8.  
  9.     Copyright:    Copyright © 1995-1999 by Apple Computer, Inc., All Rights Reserved.
  10.  
  11.                 You may incorporate this Apple sample source code into your program(s) without
  12.                 restriction. This Apple sample source code has been provided "AS IS" and the
  13.                 responsibility for its operation is yours. You are not permitted to redistribute
  14.                 this Apple sample source code as "Apple sample source code" after having made
  15.                 changes. If you're going to re-distribute the source, we require that you make
  16.                 it clear in the source that the code was descended from Apple sample source
  17.                 code, but that you've made changes.
  18.  
  19.     Change History (most recent first):
  20.                 7/20/1999    Karl Groethe    Updated for Metrowerks Codewarror Pro 2.1
  21.                 
  22.  
  23. */
  24.  
  25. #include "SVAEGetData.h"
  26.  
  27. #include "SVEditWindow.h"
  28. #include "SVEditGlobals.h"
  29. #include "SVEditAEUtils.h"
  30. #include "SVAppleEvents.h"
  31.  
  32. #include "SVAETextUtils.h"
  33. #include "SVAEWindowUtils.h"
  34. #include "SVAEAccessors.h"
  35. #include "SVAERecording.h"
  36. #include "SVToken.h"
  37.  
  38.  
  39. #include <AEPackObject.h>
  40. #include <Resources.h>
  41. #include <Script.h>
  42.  
  43.  
  44.  
  45. extern short        gRefNum;
  46.  
  47. // -----------------------------------------------------------------------
  48. //        Name:             DoGetData
  49. //        Purpose:        Handles the GetData AppleEvent.
  50. // -----------------------------------------------------------------------
  51.  
  52. pascal OSErr     DoGetData(const AppleEvent    *theAppleEvent,
  53.                                 AppleEvent    *reply,
  54.                                 long        handlerRefCon)
  55. #pragma unused (handlerRefCon)
  56.  
  57.     AEDesc        directObj = {typeNull, NULL},
  58.                 result = {typeNull, NULL};
  59.     Size        actualSize;
  60.     DescType    returnedType;
  61.     DescType    reqType;
  62.     OSErr        reqTypeErr,
  63.                 err;
  64.     
  65.         // extract the direct object, which is the object
  66.         // whose data is to be returned
  67.     err = AEGetParamDesc(theAppleEvent, keyDirectObject, typeWildCard, &directObj);
  68.     if (noErr != err) goto done;
  69.         
  70.         // now the get the type of data wanted - optional
  71.     reqTypeErr = AEGetParamPtr(theAppleEvent, keyAERequestedType, typeType,
  72.                                 &returnedType, (Ptr)&reqType, sizeof(reqType), &actualSize);
  73.         
  74.     err = GotRequiredParams(theAppleEvent);
  75.     if (noErr != err) goto done;
  76.     
  77.         // get the data
  78.     err = HandleGetData(&directObj, &result);
  79.         
  80.     err = AddResultToReply(&result, reply, err);
  81.  
  82. done:                
  83.     if (directObj.dataHandle)
  84.           AEDisposeDesc(&directObj);
  85.     if (result.dataHandle)
  86.           AEDisposeDesc(&result);
  87.         
  88.     return(err);
  89. }    // DoGetData
  90.  
  91.  
  92. // -----------------------------------------------------------------------
  93. //    Name:         HandleGetData
  94. //    Purpose:    Coerces theObj into a token which we understand and
  95. //                extracts the data requested in the token and puts it
  96. //                into dataDesc.
  97. // -----------------------------------------------------------------------
  98.  
  99. OSErr    HandleGetData(AEDesc *theObj, AEDesc *dataDesc)
  100. {
  101.     TextToken       theTextToken;
  102.     Size            tokenSize;
  103.     AEDesc          objTokenDesc = {typeNull, NULL},
  104.                     itemDesc = {typeNull, NULL},
  105.                     resultDesc = {typeNull, NULL};
  106.     long            index;
  107.     DescType        returnedType;
  108.     OSErr           err;
  109.  
  110.             //    Coerce theObj into a token which we can use - 
  111.             //        this may involve converting a list of tokens to a list of property tokens
  112.     if (typeObjectSpecifier == theObj->descriptorType)
  113.         err = AEResolve(theObj, kAEIDoMinimum, &objTokenDesc);
  114.     else    // Otherwise, just copy it
  115.         err = AEDuplicateDesc(theObj, &objTokenDesc);
  116.     
  117.     if (noErr != err) goto done;
  118.     
  119.     switch (objTokenDesc.descriptorType)
  120.     {
  121.         case typeMyApplProp:
  122.             err = GetApplicationProperty(&objTokenDesc, dataDesc);
  123.             break;
  124.             
  125.         case typeMyTextProp:
  126.             err = GetTextProperty(&objTokenDesc, dataDesc);
  127.             break;
  128.             
  129.         case typeMyWindowProp:
  130.             err = DoGetWindowProperty(&objTokenDesc, dataDesc);
  131.             break;
  132.             
  133.         case typeMyText:
  134.             GetRawDataFromDescriptor(&objTokenDesc, (Ptr)&theTextToken,
  135.                                         sizeof(theTextToken), &tokenSize);
  136.             
  137.             err = GetTextTextProperty(&theTextToken, dataDesc);
  138.             break;
  139.             
  140.         case typeAEList:
  141.             err = AECountItems(&objTokenDesc, &index);
  142.             if (noErr != err) goto done;
  143.     
  144.             for (; index > 0; index--)
  145.             {
  146.                 err = AEGetNthDesc(&objTokenDesc, index, typeWildCard, &returnedType, &itemDesc);
  147.     
  148.                 if (noErr == err)        // Call this function recursively if necessary
  149.                     err = HandleGetData(&itemDesc, &resultDesc);
  150.                 
  151.                 if (noErr == err)        // Overwrite item in list with descriptor item
  152.                     err = AEPutDesc(&objTokenDesc, index, &resultDesc);
  153.                                                         // objTokenDesc is just a copy anyway.
  154.                 if (itemDesc.dataHandle)
  155.                     AEDisposeDesc(&itemDesc);
  156.                 if (resultDesc.dataHandle)
  157.                     AEDisposeDesc(&resultDesc);
  158.             }
  159.             
  160.             err = AEDuplicateDesc(&objTokenDesc, dataDesc);        // Copy list into result
  161.             break;
  162.             
  163.         default:    
  164.             err = errAEWrongDataType;
  165.     }
  166.  
  167. done:
  168.     if (objTokenDesc.dataHandle)
  169.         AEDisposeDesc(&objTokenDesc);
  170.     
  171.     return(err);
  172. } // HandleGetData
  173.  
  174.  
  175. // Get the actual data for a text token - rather than just offset and length
  176. // used internally.
  177.  
  178. OSErr    GetTextTextProperty(TextToken* theToken, AEDesc *dataDesc)
  179. {
  180.     TEHandle    aTEH;
  181.     short        anOffset,
  182.                 aLength;
  183.     OSErr        err;
  184.     
  185.     aTEH = TEHandleFromTextToken(theToken);
  186.     anOffset = theToken->tokenOffset;
  187.     aLength = theToken->tokenLength;
  188.     
  189.     err = BuildStyledTextDesc(aTEH, anOffset, aLength, dataDesc);
  190.  
  191.     return(err);
  192. }
  193.  
  194. // -----------------------------------------------------------------------
  195. //    Name:         GetTextProperty
  196. //    Purpose:    Fills dataDesc with the requested text property.
  197. // -----------------------------------------------------------------------
  198.      
  199. OSErr GetTextProperty(const AEDesc *theTokenDesc, AEDesc *dataDesc)
  200. {
  201.     DPtr          theDocument;
  202.     TEHandle      theHTE;
  203.     Str255        fontName;
  204.     TextStyle     theTextStyle;
  205.     short         lineHeight;
  206.     short         fontAscent;
  207.     TextPropToken theTextPropToken;
  208.     Size          tokenSize;
  209.     AEDesc        tempDesc;
  210.     OSErr         err;
  211.     
  212.     err = AECoerceDesc(theTokenDesc, typeMyTextProp, &tempDesc);
  213.     if (noErr != err) goto done;
  214.     
  215.     GetRawDataFromDescriptor(&tempDesc, (Ptr)&theTextPropToken,
  216.                                     sizeof(theTextPropToken), &tokenSize);
  217.  
  218.     // For each property we build a descriptor to be returned as the reply.
  219.             
  220.     theDocument = DPtrFromWindowPtr(theTextPropToken.tokenTextToken.tokenWindow);
  221.     theHTE = theDocument->theText;
  222.     
  223.     TEGetStyle(theTextPropToken.tokenTextToken.tokenOffset - 1, &theTextStyle,
  224.                                                 &lineHeight, &fontAscent, theHTE);
  225.     
  226.     switch (theTextPropToken.tokenProperty)
  227.     {
  228.         case pText:
  229.         case pContents:
  230.             err = GetTextTextProperty(&(theTextPropToken.tokenTextToken), dataDesc);
  231.             break;
  232.             
  233.         case pFont: 
  234.             GetFontName(theTextStyle.tsFont, fontName);
  235.             
  236.             err = AECreateDesc(typeChar,  (Ptr)&fontName[1], fontName[0], dataDesc);
  237.             break;
  238.         
  239.         case pTextStyles: 
  240.             err = BuildTextStylesDesc(theTextStyle.tsFace, dataDesc);
  241.             break;
  242.  
  243.         case pPointSize: 
  244.             err = CreateOffsetDescriptor(theTextStyle.tsSize, dataDesc);
  245.             break;
  246.  
  247.         case pScriptTag: 
  248.             err = CreateOffsetDescriptor(smSystemScript, dataDesc);
  249.             break;
  250.         
  251.         case pColor: 
  252.             err = AECreateDesc(typeRGBColor, (Ptr)&theTextStyle.tsColor,
  253.                                         sizeof(theTextStyle.tsColor), dataDesc);
  254.             break;
  255.             
  256.         case pLength:
  257.             tokenSize = theTextPropToken.tokenTextToken.tokenLength;
  258.             err = AECreateDesc(typeInteger, (Ptr)&tokenSize,
  259.                                 sizeof(tokenSize), dataDesc);
  260.             break;
  261.             
  262.         case pOffset:
  263.             tokenSize = theTextPropToken.tokenTextToken.tokenOffset;
  264.             err = AECreateDesc(typeInteger, (Ptr)&tokenSize,
  265.                                 sizeof(tokenSize), dataDesc);
  266.             break;
  267.             
  268.         default:
  269.             err = errAEEventNotHandled;
  270.     }
  271.  
  272. done:
  273.     if (tempDesc.dataHandle)
  274.         AEDisposeDesc(&tempDesc);
  275.     
  276.     return(err);
  277. } // GetTextProperty
  278.     
  279. // -----------------------------------------------------------------------
  280. //        Name:             GetWindowProperty
  281. //        Purpose:        Fills dataDesc with the requested window property.
  282. // -----------------------------------------------------------------------
  283. typedef Rect **RectHandle;
  284.  
  285. OSErr    DoGetWindowProperty(const AEDesc *theWPTokenObj, AEDesc *dataDesc)
  286. {             
  287.     Str255          theName;
  288.     Boolean         theBoolean;
  289.     Rect            theRect;
  290.     Point           thePoint;
  291.     Rect            winRect;
  292.     Rect            userRect;
  293.     short           theIndex;
  294.     DPtr            docPtr;
  295.     TEHandle        theHTE;
  296.     GrafPtr         savePort;
  297.     WindowPropToken theWindowPropToken;
  298.     AEDesc          tempDesc = {typeNull, NULL};
  299.     Size            tokenSize;
  300.     OSErr           err;
  301.     
  302.     err = AECoerceDesc(theWPTokenObj,typeMyWindowProp, &tempDesc);
  303.     if (noErr != err) goto done;
  304.     
  305.     GetRawDataFromDescriptor(&tempDesc, (Ptr)&theWindowPropToken,
  306.                                 sizeof(theWindowPropToken),  &tokenSize);
  307.     
  308.     switch (theWindowPropToken.tokenProperty)
  309.     {
  310.         case pName:
  311.             GetWTitle(theWindowPropToken.tokenWindowToken.tokenWindow, theName);
  312.             err = AECreateDesc(typeChar, (Ptr)&theName[1], theName[0], dataDesc);
  313.             break;
  314.             
  315.         case pText:
  316.         case pContents:
  317.             docPtr = DPtrFromWindowPtr(theWindowPropToken.tokenWindowToken.tokenWindow);
  318.             theHTE = docPtr->theText;
  319.             err = BuildStyledTextDesc(theHTE, 1, (**theHTE).teLength, dataDesc);
  320.             break;
  321.             
  322.         case pBounds:
  323.             GetPort(&savePort);
  324.             SetPort(theWindowPropToken.tokenWindowToken.tokenWindow);
  325.             theRect = (*((WindowPeek)theWindowPropToken.tokenWindowToken.tokenWindow)->strucRgn)->rgnBBox;
  326.             err = AECreateDesc(typeQDRectangle, (Ptr)&theRect, sizeof(theRect), dataDesc);
  327.             SetPort(savePort);
  328.             break;
  329.             
  330.         case pPosition:
  331.             thePoint.v = (*((WindowPeek)theWindowPropToken.tokenWindowToken.tokenWindow)->strucRgn)->rgnBBox.top;
  332.             thePoint.h = (*((WindowPeek)theWindowPropToken.tokenWindowToken.tokenWindow)->strucRgn)->rgnBBox.left;
  333.             err= AECreateDesc(typeQDPoint, (Ptr)&thePoint, sizeof(thePoint), dataDesc);
  334.             break;
  335.             
  336.         case pVisible:
  337.             theBoolean = ((WindowPeek)theWindowPropToken.tokenWindowToken.tokenWindow)->visible;
  338.             err = AECreateDesc(typeBoolean, (Ptr)&theBoolean, sizeof(theBoolean), dataDesc);
  339.             break;
  340.             
  341.         case pIsModal:
  342.         case pIsFloating:
  343.             theBoolean = false;
  344.             err = AECreateDesc(typeBoolean, (Ptr)&theBoolean, sizeof(theBoolean), dataDesc);
  345.             break;
  346.             
  347.         case pIsZoomed:
  348.             if (((WindowPeek)theWindowPropToken.tokenWindowToken.tokenWindow)->spareFlag)
  349.             {
  350.                 GetPort(&savePort);
  351.                 SetPort(theWindowPropToken.tokenWindowToken.tokenWindow);
  352.                 
  353.                 userRect = **((RectHandle)((WindowPeek)qd.thePort)->dataHandle);
  354.                 winRect  = qd.thePort->portRect;
  355.                 LocalToGlobal((Point *)&winRect.top);
  356.                 LocalToGlobal((Point *)&winRect.bottom);
  357.                 
  358.                 theBoolean = ! EqualRect(&userRect, &winRect);
  359.                 SetPort(savePort);
  360.             }
  361.             else
  362.                 theBoolean = false;
  363.                             
  364.             err = AECreateDesc(typeBoolean, (Ptr)&theBoolean, sizeof(theBoolean), dataDesc);
  365.             break;
  366.             
  367.         case pIsResizable:
  368.         case pHasTitleBar:
  369.         case pHasCloseBox:
  370.         case pIsZoomable:
  371.             theBoolean = true;
  372.             err = AECreateDesc(typeBoolean, (Ptr)&theBoolean, sizeof(theBoolean), dataDesc);
  373.             break;
  374.             
  375.         case pIsModified:
  376.             docPtr = DPtrFromWindowPtr(theWindowPropToken.tokenWindowToken.tokenWindow);
  377.             theBoolean = docPtr->dirty;
  378.             err = AECreateDesc(typeBoolean, (Ptr)&theBoolean, sizeof(theBoolean), dataDesc);
  379.             break;
  380.             
  381.         case pIndex:
  382.             theIndex = 0;
  383.             if (theWindowPropToken.tokenWindowToken.tokenWindow) 
  384.                 do
  385.                     theIndex++;
  386.                 while (theWindowPropToken.tokenWindowToken.tokenWindow != GetWindowPtrOfNthWindow(theIndex));
  387.                             
  388.             err = AECreateDesc(typeShortInteger, (Ptr)theIndex, sizeof(theIndex), dataDesc);
  389.             break;
  390.             
  391.         case pPageSetup:
  392.                 docPtr = DPtrFromWindowPtr(theWindowPropToken.tokenWindowToken.tokenWindow);
  393.                 
  394.                 HLock((Handle)docPtr->thePrintSetup);
  395.                 err = AECreateDesc(typeTPrint, (Ptr)*(docPtr->thePrintSetup),
  396.                                                                 sizeof(TPrint), dataDesc);
  397.                 HUnlock((Handle)docPtr->thePrintSetup);
  398.  
  399.  
  400.         case pSelection:
  401.             docPtr = DPtrFromWindowPtr(theWindowPropToken.tokenWindowToken.tokenWindow);
  402.             err = MakeSelectedTextObj(theWindowPropToken.tokenWindowToken.tokenWindow,
  403.                                                                  docPtr->theText, dataDesc);
  404.             break;
  405.     
  406.         default:
  407.             err = errAEEventNotHandled;
  408.     }
  409.  
  410. done:
  411.     if (tempDesc.dataHandle)
  412.         AEDisposeDesc(&tempDesc);
  413.             
  414.     return(err);
  415. } // GetWindowProperty
  416.     
  417. // -----------------------------------------------------------------------
  418. //        Name:             GetApplicationProperty
  419. //        Purpose:        Fills dataDesc with the requested application property.
  420. // -----------------------------------------------------------------------
  421.      
  422. OSErr    GetApplicationProperty(const AEDesc *theObjToken, AEDesc *result)
  423. {
  424.     Str255                name;
  425.     Boolean                isFront;
  426.     ApplPropToken        theApplPropToken;
  427.     AEDesc                aDesc = {typeNull, NULL},
  428.                         nullDesc = {typeNull, NULL};
  429.     Size                tokenSize;
  430.     DescType            theType;
  431.     ProcessInfoRec        processInfo;
  432.     ProcessSerialNumber    currentProcess;
  433.       short                refNum;
  434.     Handle                aHandle;
  435.       OSErr                err;
  436.     
  437.     err = AECoerceDesc(theObjToken, typeMyApplProp, &aDesc);
  438.     if (noErr != err) goto done;
  439.     
  440.     GetRawDataFromDescriptor(&aDesc, (Ptr)&theApplPropToken,
  441.                                         sizeof(theApplPropToken), &tokenSize);
  442.       
  443.     switch (theApplPropToken.tokenApplProperty)
  444.     {
  445.         case pBestType:      // Return the null descriptor representing
  446.         case pDefaultType:    // the application.
  447.             err = AEDuplicateDesc(&nullDesc, result);
  448.             break;
  449.         
  450.         case pClass:
  451.             theType = cApplication;
  452.             err = AECreateDesc(typeType, (Ptr)&theType, sizeof(DescType), result);
  453.             break;
  454.         
  455.         case pName:
  456.             // Clear out the name, and then call the process manager to get
  457.             // the string for the name of our application.
  458.             
  459.             name[0] = 0;
  460.             processInfo.processInfoLength = sizeof(processInfo);
  461.             processInfo.processName = name;
  462.             processInfo.processAppSpec = NULL;
  463.             
  464.             GetCurrentProcess(¤tProcess);
  465.             GetProcessInformation(¤tProcess, &processInfo);
  466.             
  467.             // Create an AEDesc returning the application name string
  468.             // returned by the process manager.
  469.  
  470.             err = AECreateDesc(typeChar, (Ptr)&name[1], name[0], result);
  471.             break;
  472.         
  473.         case pIsFrontProcess:
  474.             isFront = ! gInBackground;
  475.             err = AECreateDesc(typeBoolean, (Ptr)&isFront, sizeof(isFront), result);
  476.             break;
  477.  
  478.         case pVersion:
  479.             refNum = CurResFile();    // save current resource
  480.             UseResFile(gRefNum);    // set this resource to be current
  481.             aHandle = (Handle)Get1Resource((ResType)'vers', 1);
  482.             HLock(aHandle);
  483.             err = AECreateDesc(typeVersion, *aHandle, GetHandleSize(aHandle), result);
  484.             HUnlock(aHandle);
  485.             UseResFile(refNum);     // reset back to resource previously set
  486.             break;
  487.  
  488.         default:   // We don't handle the requested property.
  489.             err = errAEEventNotHandled;
  490.     }
  491.  
  492. done:
  493.     if (aDesc.dataHandle)
  494.         AEDisposeDesc(&aDesc);
  495.             
  496.     return(err);
  497. } // GetApplicationProperty
  498.